/* @flow */

import { toArray } from '../util/index'

export function initUse (Vue: GlobalAPI) {
  // 给 Vue 添加一个 use 方法
  Vue.use = function (plugin: Function | Object) {
    // this 指向 Vue 的构造函数
    // 获取 Vue 构造函数的 _installedPlugins 若没有则为其设置成空数组
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    if (installedPlugins.indexOf(plugin) > -1) {
      // 若已经注册则直接返回 Vue
      return this
    }

    // additional parameters
    // 转换成数组并删除数组中的第一个元素
    const args = toArray(arguments, 1)
    // 把 Vue 构造函数作为第一个元素插入
    args.unshift(this)
    if (typeof plugin.install === 'function') {
      // plugin 为对象
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      // plugin 为函数
      plugin.apply(null, args)
    }
    // 保存已安装的插件
    installedPlugins.push(plugin)
    return this
  }
}
